package org.lc.stk.repository;

import java.util.List;
import java.util.Optional;

import org.lc.stk.model.Department;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface DepartmentRepository extends JpaRepository<Department, Long> {
    
    // 查找未删除的部门
    List<Department> findByDeletedFalse();
    
    // 通过编码查找未删除的部门
    Optional<Department> findByCodeAndDeletedFalse(String code);
    
    // 查找未删除的根部门（parent为null的部门）
    List<Department> findByParentIsNullAndDeletedFalse();
    
    // 查找特定部门的未删除的子部门
    List<Department> findByParentAndDeletedFalse(Department parent);
    
    // 按排序号升序查找未删除的子部门
    List<Department> findByParentAndDeletedFalseOrderByOrderNumberAsc(Department parent);
    
    // 检查部门编码是否已存在（排除已删除的）
    boolean existsByCodeAndDeletedFalse(String code);
    
    // 检查部门名称在同一父部门下是否已存在（排除已删除的）
    boolean existsByNameAndParentAndDeletedFalse(String name, Department parent);
    
    // 查找特定类型的未删除部门
    List<Department> findByTypeAndDeletedFalse(String type);
    
    // 使用递归CTE获取部门及其所有子部门
    @Query(value = """
            WITH RECURSIVE dept_tree AS (
                -- 基础查询：找到起始部门
                SELECT d.* FROM departments d 
                WHERE d.id = :departmentId AND d.deleted = false
                
                UNION ALL
                
                -- 递归查询：找到子部门
                SELECT d.* FROM departments d 
                INNER JOIN dept_tree dt ON d.parent_id = dt.id
                WHERE d.deleted = false
            )
            SELECT * FROM dept_tree
            """, nativeQuery = true)
    List<Department> findDepartmentAndDescendants(@Param("departmentId") Long departmentId);
}